﻿using System.Collections.Generic;
using Microsoft.Maui.Graphics.Text.Immutable;

namespace Microsoft.Maui.Graphics.Text
{
    public static class TextAttributeExtensions
    {
        public const float DefaultFontSize = 12f;

        public static string GetFontName(this ITextAttributes attributes)
        {
            return attributes.GetAttribute(TextAttribute.FontName);
        }

        public static void SetFontName(
            this Dictionary<TextAttribute, string> attributes,
            string value)
        {
            attributes.SetAttribute(TextAttribute.FontName, value);
        }

        public static float GetFontSize(
            this ITextAttributes attributes,
            float? fontSize = null)
        {
            return attributes.GetFloatAttribute(TextAttribute.FontName, fontSize ?? DefaultFontSize);
        }

        public static void SetFontSize(
            this Dictionary<TextAttribute, string> attributes,
            float value)
        {
            attributes.SetFloatAttribute(TextAttribute.FontName, value, DefaultFontSize);
        }

        public static bool GetUnderline(this ITextAttributes attributes)
        {
            return attributes.GetBoolAttribute(TextAttribute.Underline);
        }

        public static void SetUnderline(
            this Dictionary<TextAttribute, string> attributes,
            bool value)
        {
            attributes.SetBoolAttribute(TextAttribute.Underline, value);
        }

        public static bool GetBold(this ITextAttributes attributes)
        {
            return attributes.GetBoolAttribute(TextAttribute.Bold);
        }

        public static void SetBold(
            this Dictionary<TextAttribute, string> attributes,
            bool value)
        {
            attributes.SetBoolAttribute(TextAttribute.Bold, value);
        }

        public static bool GetItalic(this ITextAttributes attributes)
        {
            return attributes.GetBoolAttribute(TextAttribute.Italic);
        }

        public static void SetItalic(
            this Dictionary<TextAttribute, string> attributes,
            bool value)
        {
            attributes.SetBoolAttribute(TextAttribute.Italic, value);
        }

        public static bool GetUnorderedList(this ITextAttributes attributes)
        {
            return attributes.GetBoolAttribute(TextAttribute.UnorderedList);
        }

        public static void SetUnorderedList(
            this Dictionary<TextAttribute, string> attributes,
            bool value)
        {
            attributes.SetBoolAttribute(TextAttribute.UnorderedList, value);
        }

        public static MarkerType GetMarker(this ITextAttributes attributes)
        {
            return attributes.GetEnumAttribute(TextAttribute.UnorderedList, MarkerType.ClosedCircle);
        }

        public static void SetMarker(
            this Dictionary<TextAttribute, string> attributes,
            MarkerType value)
        {
            attributes.SetEnumAttribute(TextAttribute.UnorderedList, value, MarkerType.ClosedCircle);
        }

        public static bool GetStrikethrough(this ITextAttributes attributes)
        {
            return attributes.GetBoolAttribute(TextAttribute.Strikethrough);
        }

        public static void SetStrikethrough(
            this Dictionary<TextAttribute, string> attributes,
            bool value)
        {
            attributes.SetBoolAttribute(TextAttribute.Strikethrough, value);
        }

        public static bool GetSuperscript(this ITextAttributes attributes)
            => attributes.GetBoolAttribute(TextAttribute.Superscript);

        public static void SetSuperscript(this Dictionary<TextAttribute, string> attributes, bool value)
            => attributes.SetBoolAttribute(TextAttribute.Superscript, value);

        public static bool GetSubscript(this ITextAttributes attributes)
            => attributes.GetBoolAttribute(TextAttribute.Subscript);

        public static void SetSubscript(this Dictionary<TextAttribute, string> attributes, bool value)
            => attributes.SetBoolAttribute(TextAttribute.Subscript, value);

        public static string GetForegroundColor(this ITextAttributes attributes)
            => attributes.GetAttribute(TextAttribute.Color);

        public static void SetForegroundColor(this Dictionary<TextAttribute, string> attributes, string value)
            => attributes.SetAttribute(TextAttribute.Color, value);

        public static string GetBackgroundColor(this ITextAttributes attributes)
            => attributes.GetAttribute(TextAttribute.Background);

        public static void SetBackgroundColor(this Dictionary<TextAttribute, string> attributes, string value)
            => attributes.SetAttribute(TextAttribute.Background, value);

        public static ITextAttributes Union(
            this IReadOnlyDictionary<TextAttribute, string> first,
            IReadOnlyDictionary<TextAttribute, string> second)
        {
            return new TextAttributes(first, second);
        }
    }
}